package com.itheima.utils;

import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.model.ObjectMetadata;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.model.PutObjectResult;
import com.qcloud.cos.region.Region;
import com.qcloud.cos.transfer.TransferManager;
import com.qcloud.cos.transfer.TransferManagerConfiguration;

import java.io.File;
import java.io.FileInputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 腾讯存储工具类
 */
public class QcloudUtils {
    public static COSClient cosClient;
    public static TransferManager transferManager;
    // 前缀:/images/
    public static String prefix="";
    // 区域名称
    public static String regionName="ap-shanghai";
    // 存储桶名称
    public static String bucketName = "java-test-1257253955";
    // secretId
    public static String secretId="AKIDua2B7y24TmqjIbNfS8A0fDzZyAZqIzqX";
    // secretId
    public static String secretKey="ynvvujKgroa7QUN4Zr0vd9thHilvyrcZ";

    /**
     * 初始化连接配置,如果报错看看自己的存储桶是不是公有读私有写
     */
    public static void initClient() {
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
        // 2 设置 bucket 的区域, COS 地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
        // clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
        Region region = new Region(regionName);
        ClientConfig clientConfig = new ClientConfig(region);
        // 3 生成 cos 客户端。
        cosClient = new COSClient(cred, clientConfig);
        // 高级接口传输类
        // 线程池大小，建议在客户端与 COS 网络充足（例如使用腾讯云的 CVM，同地域上传 COS）的情况下，设置成16或32即可，可较充分的利用网络资源
        // 对于使用公网传输且网络带宽质量不高的情况，建议减小该值，避免因网速过慢，造成请求超时。
        ExecutorService threadPool = Executors.newFixedThreadPool(32);
        // 传入一个 threadpool, 若不传入线程池，默认 TransferManager 中会生成一个单线程的线程池。
        transferManager = new TransferManager(cosClient, threadPool);
        // 设置高级接口的分块上传阈值和分块大小为10MB
        TransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration();
        transferManagerConfiguration.setMultipartUploadThreshold(10 * 1024 * 1024);
        transferManagerConfiguration.setMinimumUploadPartSize(10 * 1024 * 1024);
        transferManager.setConfiguration(transferManagerConfiguration);
    }

    /**
     * 上传文件
     * @param fileName 文件名--UUID.jpeg
     * @param fileInputStream 文件输入流--(FileInputStream) MultipartFile.getInputStream()
     * @param fileSize 文件大小--MultipartFile.getSize()
     */
    public static void putObject(String fileName ,FileInputStream fileInputStream,long fileSize){
        initClient();
        // 指定要上传到 COS 上对象键,就是文件名
        String key = prefix+fileName;
        // 设置上传流的参数
        ObjectMetadata objectMetadata = new ObjectMetadata();
        // 设置输入流长度为文件大小
        objectMetadata.setContentLength(fileSize);
        // 设置 Content type, 默认是 application/octet-stream
//        objectMetadata.setContentType("image/jpeg");
        PutObjectResult putObjectResult = cosClient.putObject(bucketName, key, fileInputStream, objectMetadata);
//        System.out.println("上传完成");
//        System.out.println(putObjectResult);
//        关闭上传连接
        cosClient.shutdown();
    }

    /**
     * 删除文件
     * @param fileName 文件名(注意有无文件路径)
     */
    public static void deleteObject(String fileName){
//        初始化连接
        initClient();
        cosClient.deleteObject(bucketName, prefix+fileName);
//        关闭连接
        cosClient.shutdown();
    }

}
